#!/usr/bin/env bash

### BEGIN INIT INFO
# Provides:          uwsgi
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the uwsgi app server
# Description:       starts uwsgi app server using start-stop-daemon
### END INIT INFO

# Based on https://github.com/pharaujo/uwsgi-init-script

set -e

VERSION=$(basename $0)
PIKU_USER=piku

PATH=/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/bin/$VERSION
PIKU_ROOT=/home/$PIKU_USER/.piku
RUN=$PIKU_ROOT/uwsgi
ENABLED_CONFIGS_DIR=$PIKU_ROOT/uwsgi-enabled
AVAILABLE_CONFIGS_DIR=$PIKU_ROOT/uwsgi-available
OWNER=$PIKU_USER
NAME=$VERSION
DESC=$VERSION
OP=$1
CORES=`grep -c ^processor /proc/cpuinfo`
THREADS=`echo "$CORES * 4" | bc`

[[ -x $DAEMON ]] || exit 0
[[ -d $RUN ]] || mkdir $RUN && chown $OWNER $RUN

DAEMON_OPTS=""

# Include uwsgi defaults if available
if [[ -f /etc/default/$VERSION ]]; then
    . /etc/default/$VERSION
fi

do_pid_check()
{
    local PIDFILE=$1
    [[ -f $PIDFILE ]] || return 0
    local PID=$(cat $PIDFILE)
    for p in $(pgrep $VERSION); do
        [[ $p == $PID ]] && return 1
    done
    return 0
}


do_start()
{
    local PIDFILE=$RUN/$VERSION.pid
    set -o noglob
    local START_OPTS=" \
        --ini $RUN/uwsgi.ini \
        --daemonize $RUN/uwsgi.log \
        --pidfile $PIDFILE"
    if do_pid_check $PIDFILE; then
        sudo -u $OWNER -i $VERSION $DAEMON_OPTS $START_OPTS
    else
        echo "Already running!"
    fi
}

send_sig()
{
    local PIDFILE=$RUN/$VERSION.pid
    set +e
    [[ -f $PIDFILE ]] && kill $1 $(cat $PIDFILE) > /dev/null 2>&1
    set -e
}

wait_and_clean_pidfile()
{
    local PIDFILE=$RUN/$VERSION.pid
    until do_pid_check $PIDFILE; do
        echo -n "";
    done
    rm -f $PIDFILE
}

do_stop()
{
    send_sig -3
    wait_and_clean_pidfile
}

do_reload()
{
    send_sig -1
}

do_force_reload()
{
    send_sig -15
}

get_status()
{
    local PIDFILE=$RUN/$VERSION.pid
    if kill -0 $(cat $PIDFILE) > /dev/null 2>&1; then
        echo "$VERSION is running"
    else
        echo "$VERSION is not started"
    fi
}

enable_configs()
{
    local configs

    if [[ $# -eq 0 || ${1,,} = 'all' ]]; then
        configs=$(diff $AVAILABLE_CONFIGS_DIR $ENABLED_CONFIGS_DIR \
            | grep $AVAILABLE_CONFIGS_DIR \
            | sed -re 's#.+: (.+)$#\1#')
    else
        configs=$@
    fi

    for c in $configs; do
        echo -n "Enabling $c..."
        [[ -f $ENABLED_CONFIGS_DIR/$c ]] && echo "Skipped" && continue
        [[ -f $AVAILABLE_CONFIGS_DIR/$c ]] && \
            ln -s $AVAILABLE_CONFIGS_DIR/$c $ENABLED_CONFIGS_DIR && \
            echo "Done" && \
            continue
        echo "Error"
    done
}

disable_configs()
{
    local configs
    if [[ $# -eq 0 || ${1,,} = 'all' ]]; then
        configs=$(find $ENABLED_CONFIGS_DIR -type l -exec basename {} \;)
    else
        configs=$@
    fi

    for c in $configs; do
        local config_path="$ENABLED_CONFIGS_DIR/$c"
        echo -n "Disabling $c..."
        [[ ! -L $config_path ]] && echo "Skipped" && continue
        [[ -f $config_path ]] && rm $config_path && echo "Done" && continue
        echo "Error"
    done
}

case "$OP" in
    start)
        echo "Starting $DESC: "
        do_start
        echo "$NAME."
        ;;
    stop)
        echo -n "Stopping $DESC: "
        do_stop
        echo "$NAME."
        ;;
    reload)
        echo -n "Reloading $DESC: "
        do_reload
        echo "$NAME."
        ;;
    force-reload)
        echo -n "Force-reloading $DESC: "
        do_force_reload
        echo "$NAME."
       ;;
    restart)
        echo  "Restarting $DESC: "
        do_stop
        sleep 1
        do_start
        echo "$NAME."
        ;;
    status)
        get_status
        ;;
    enable)
        shift
        enable_configs $@
        ;;
    disable)
        shift
        disable_configs $@
        ;;
    *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|restart|reload|force-reload|status"
            "|enable|disable}">&2
        exit 1
        ;;
esac
exit 0


